#ifndef CONTRASTENHANCEMENTALGORITHM_H
#define CONTRASTENHANCEMENTALGORITHM_H

#include "ImageProcessingAlgorithmBase.h"
#include "ContrastEnhancementSettingsForm.h"
#include <QObject>
#include <QImage>

/**
 * @brief 基于直方图均衡化的对比度增强算法类
 * 该类通过计算输入图像的灰度直方图并进行归一化处理，实现图像对比度的自动增强
 */
class ContrastEnhancementAlgorithm : public ImageProcessingAlgorithmBase {
    Q_OBJECT
    Q_INTERFACES(ImageProcessingAlgorithmBase)
    Q_PLUGIN_METADATA(IID IMAGEPROCESSINGALGORITHMBASE_IID)
public:
    Q_INVOKABLE ContrastEnhancementAlgorithm(QObject *parent = nullptr);
    ~ContrastEnhancementAlgorithm() override;

    // 初始化算法
    void initialize() override;

    // 获取算法名称
    QString algorithmName() const override;

    /**
     * @brief 设置输入图像
     * @param imageId 图像唯一标识符
     * @param inputImage 输入的原始图像（支持任意格式，内部会转换为灰度图）
     */
    void setInputImage(const QString &imageId, const QImage &inputImage) override;

    /**
     * @brief 获取当前处理的图像ID
     * @return 图像ID
     */
    QString currentImageId() const override;

    /**
     * @brief 执行图像处理
     * 处理结果将通过imageProcessed信号输出
     * @param parameters 处理参数字符串，每个参数之间使用,隔开
     */
    void processImage(const QString& parameters = "") override;

    /**
     * @brief 设置对比度增强强度
     * @param strength 增强强度值(0-100)
     */
    void setEnhancementStrength(int strength);

    /**
     * @brief 获取当前对比度增强强度
     * @return 增强强度值(0-100)
     */
    int enhancementStrength() const;

    /**
     * @brief 获取算法处理参数
     * @return 包含处理参数的QVariantMap
     */
    QVariantMap getProcessParameters() const override;

    /**
     * @brief 设置算法处理参数
     * @param params 包含处理参数的QVariantMap
     */
    void setProcessParameters(const QVariantMap &params) override;
    
    /**
     * @brief 恢复默认参数
     * 将算法的所有参数恢复到默认设置
     */
    void resetToDefaultParameters() override;

private slots:
    /**
     * @brief 处理设置变更信号
     * @param strength 新的增强强度值
     */
    void onSettingsChanged(int strength);

private:
    // 设置表单指针
    ContrastEnhancementSettingsForm *m_settingsForm;

    // 对比度增强强度(0-100)
    int m_enhancementStrength;

    // 存储输入图像
    QImage m_inputImage;

    // 当前处理的图像ID
    QString m_imageId;

    // 处理状态标志
    bool m_processed;
    
    // 是否启用自动增强
    bool m_autoEnhancementEnabled;
    
    // 上次处理时间戳，用于限制处理频率
    qint64 m_lastProcessTime;

private slots:
    // 自动对比度增强函数
    void autoEnhanceContrast();
};

#endif // CONTRASTENHANCEMENTALGORITHM_H
